import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class Cylic {


    /**
     *  大概的意思就是一个可循环利用的屏障。该命令只在每个屏障点运行一次
     *  CyclicBarrier(int parties, Runnable barrierAction)
     *  parties相互等待的线程数量    barrierAction到达屏障点运行的业务
     *  await() 该方法被调用时表示当前线程已经到达屏障点，当前线程阻塞进入休眠状态，直到所有线程都到达屏障点，当前线程才会被唤醒。
     *  该操作由最后一个进入屏障点的线程执行。
     */
    public static void main(String[] args) {

        CyclicBarrier cyclicBarrier = new CyclicBarrier(3, () -> {
            System.out.println(Thread.currentThread().getName() + " 过关了");
        });


        for (int i = 0; i < 3; i++) {
            new Thread(()->{
                try {
                    System.out.println(Thread.currentThread().getName() + " 开始第一关");
                    //TimeUnit.SECONDS.sleep(new Random().nextInt(4));
                    System.out.println(Thread.currentThread().getName() + " 开始打boss");
                    cyclicBarrier.await();   //3个线程都调用await()表示都到达屏障处，都被唤醒，由最后一个到达的线程执行rannable里的业务

                    System.out.println(Thread.currentThread().getName() + " 开始第二关");
                    //TimeUnit.SECONDS.sleep(new Random().nextInt(4));
                    System.out.println(Thread.currentThread().getName() + " 开始打boss");
                    cyclicBarrier.await();

                    System.out.println(Thread.currentThread().getName() + " 开始第三关");
                    //TimeUnit.SECONDS.sleep(new Random().nextInt(4));
                    System.out.println(Thread.currentThread().getName() + " 开始打boss");
                    cyclicBarrier.await();


                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                } catch (BrokenBarrierException e) {
                    throw new RuntimeException(e);
                }


            },String.valueOf(i)).start();
        }
        System.out.println("Hello world!");
    }
}